#ifndef __DIROPT__
#define __DIROPT__

#include <my_header.h>

// 后续需要**长短命令分离执行**时，可做↓(或者可以再多码几个相关的封装函数？)
// 在服务端主人程序 进入 循环等待客户端链接什么的 之前 ，在栈上或堆上声明一个长一些的ClientSession结构体指针数组，
// 然后在获取实际存在的netfd，和存在于数据库内部的用户名(要已经有匹配的初始根目录，或者也将 检测不存在后创建之类的逻辑 封装进初始化？)后，
// **进入其它循环什么的操作之前**，即可再声明一个ClientSession结构体，
// 然后将其初始化后的指针类型加入数组内部，后续需要的话再经过循环查询用户姓名对应的结构体，应该就可以随时用里面的信息了


// ====================== 配置常量 ======================

// #define MAX_PATH_LEN PATH_MAX     // 支持长路径,注释了，因为xshell连接Linux使用vim编辑时可以识别到PATH_MAX，但在Windows下使用VSCODE编译时会报错，PATH_MAX未定义
#define MAX_PATH_LEN 4096     // 支持长路径
#define MAX_LS_BUFFER 4096   // 大目录支持
#define NET_SAVE_ROOT "/home/muridae/DraftsJ/TestsJ/Private_protocol_file_management_server_projectJ/PPFMSPJ/Tests1J/tmp/safe_root/"
#define DATABASE_IP "localhost" //链接数据库地址
#define DATABASE_ACCOUNT "root" //数据库登录用户名
#define DATABASE_PASSWORD "123" //数据库用户密码
#define DATABASE_NAME "VirtualNetDiskJ" //数据库名
#define TABLE_NAME "VirtualFilesJ" //数据库表名

// ====================== 数据结构 ======================
typedef struct PathComponent {                              


    int path_id;


    char name[64];
    struct PathComponent *next;
    int path_length;
    struct PathComponent *tail;
} PathComponent;

typedef struct {

    MYSQL * mysql;                  //进入要实际操作的循环前需要赋值
    char user_name[256];            //进入要实际操作的循环前需要赋值
    char current_dir_tmp[MAX_PATH_LEN]; //临时存放拼接后的路径
    int current_dir_tmp_id;
    int pcn_id;
    int root_id;

    char current_dir[MAX_PATH_LEN];   // 当前工作目录
    /* char root_dir[MAX_PATH_LEN];      // 沙箱根目录 */
    int stack_top;                    // 栈顶指针   
    PathComponent *pcn;
    int netfd;                      //进入要实际操作的循环前需要赋值
    char recv_path[MAX_PATH_LEN];  //进入要实际操作的循环前需要赋值
    /* char sumPath[MAX_PATH_LEN]; */
    int opt;

} ClientSession;

//初始化一下
/* int init_session(ClientSession *session, const char *root); */
int init_session(ClientSession *session,MYSQL *mysql,char *user_name,int netfd);

int handle_path(ClientSession* css);

//弹已经优化好的栈组成路径
int build_path(ClientSession *css);

/* int sum_path(ClientSession *css); */

//辅助函数，验证绝对路径的真实性，存在的话会返回1
int is_path_accessible(ClientSession *css);

int check_dir(ClientSession *css);

int cd_dir(ClientSession * css);

int ls_dir(ClientSession *css);

int pwd_dir(ClientSession *css);

int mk_dir(ClientSession *css);

int rm_dir(ClientSession * css);

int opt_dir(ClientSession *css,int opt,char *recv_path);



#endif
